package GreedySnakeGame;

import javax.swing.*;
import java.util.LinkedList;

/**
 * ==================================
 * 编码格式: UTF-8
 * 开发人员: acer
 * 开发工具: IntelliJ IDEA
 * 开发时间: 2020/7/11 0011 23:28
 * 项目名称: GreedySnake
 * 个人箴言: ”键盘敲烂，工资过万“
 * ==================================
 */

/*  创建Snake类表示蛇
    一条蛇有多个节点使用LinkedList集合存储Node节点
    蛇出生的时候有6个节点
 */
public class Snake {

    private LinkedList<Node> body;  //蛇的身体
    private Direction direction = Direction.LEFT;   //蛇的运动方向，默认向左
    private boolean isLiving = true;    //判断蛇是否活着

    public Snake() {
        initSnake();    // 初始化蛇身体
    }

    // 初始化蛇身体
    private void initSnake() {
        body = new LinkedList<>();  // 创建集合
        // 创建6个节点放在集合中
        body.add(new Node(16, 20));
        body.add(new Node(17, 20));
        body.add(new Node(18, 20));
        body.add(new Node(19, 20));
        body.add(new Node(20, 20));
    }

    //控制蛇移动：蛇会沿着蛇头的方向移动在蛇头的运动方向添加一个节点，然后把蛇尾的节点删除
    public void move() {
        if (isLiving) {

            Node head = body.getFirst();    // 获取蛇头
            addHead(head);  // 在蛇头的运动方向添加一个节点
            body.removeLast();  //删除蛇尾的节点

            //判断蛇是否撞墙
            head = body.getFirst();
            if (head.getX() < 0 || head.getY() < 0 || head.getX() >= 40 || head.getY() >= 40) {
                isLiving = false;
                JOptionPane.showMessageDialog(null,"哎呀，撞墙了！","你输了",JOptionPane.ERROR_MESSAGE);

            }

            //判断蛇是否碰到自己的身体
            for (int i = 1; i < body.size(); i++) {
                Node node = body.get(i);
                if (head.getX() == node.getX() && head.getY() == node.getY()) {
                    isLiving = false;
                    JOptionPane.showMessageDialog(null,"哎呀，追尾了！","你输了",JOptionPane.ERROR_MESSAGE);
                }
            }
        }
    }

    private void addHead(Node head) {
        head = body.getFirst();    // 获取蛇头
        switch (direction) {
            case UP:    // 在蛇头的上边添加一个节点
                body.addFirst(new Node(head.getX(), head.getY() - 1));
                break;
            case DOWN:  // 在蛇头的下边添加一个节点
                body.addFirst(new Node(head.getX(), head.getY() + 1));
                break;
            case LEFT:  // 在蛇头的左边添加一个节点
                body.addFirst(new Node(head.getX() - 1, head.getY()));
                break;
            case RIGHT: // 在蛇头的右边添加一个节点
                body.addFirst(new Node(head.getX() + 1, head.getY()));
                break;
        }
    }

    public LinkedList<Node> getBody() {
        return body;
    }

    public void setBody(LinkedList<Node> body) {
        this.body = body;
    }

    public Direction getDirection() {
        return direction;
    }

    public void setDirection(Direction direction) {
        this.direction = direction;
    }

    //蛇吃食物
    public void eat(Node food) {
        Node head = body.getFirst();    // 获取蛇头
        addHead(head);
    }
}
